/*
 * tcu_can.h
 *
 *  Created on: 2019-4-26
 *      Author: root
 */

#ifndef TCU_CAN_H_
#define TCU_CAN_H_
#include "protocol_can.h"
#ifdef __cplusplus

extern "C"{

#endif

#define DC           1
#define AC           2

#define GW_SDANDARD    0  //1 严格国网标准 0 容错
#define  HSSY       1     //	华商三优
#define  XJ             2     //	许继
#define SZHS       3      //   苏州和顺
#define SXDZ       4       //三星电子
#define GZKL       5       //广州科力


#define CTRL_PW_NORMAL  0  //发送到CANDLL err err err
#define CTRL_PW_COMB  1
#define CTRL_PW_COMB_FIN  2
#define CTRL_PW_EN  3
#define CTRL_PW_FIN  4
#define START_CHARGE_FAIL  5//充电失败，临时放在这里
//#define FIN_START_CHARGE_FAIL  6//充电失败，临时放在这里

#define DURATION_ERR   5   //错误帧持续时间
#define COMM_CUTOFF  4   //任何帧都没收到的持续时间
#define FIN_START_CHARGE      120//充电完成超时
#define FIN_STOP_CHARGE       60//停止完成超时
#define YC_OVER                           10//遥测超时
#define YX_OVER                            5//摇信超时

#define HEART_OVER_ERR  0    //心跳超时
#define YC_OVER_ERR  1    //遥测超时
#define YX_OVER_ERR  2    //摇信超时

enum CHARGE_FAIL_REASON
{
	MAIN_STOP_FIN=0x40,//主控要求停止
	OVER_TIME_PF01=0x41,//发送充电命令01，等待02命令超时
	OVER_TIME_PE11=0x42,//收到02返回后，等待pf=11超时
	SET_COMB_FAIL=0x43,//共充设置失败
	OVER_TIME_PF03=0x44,//TCU发送停止充电命令控制器返回超时后，但控制器已经停止充电
	OVER_TIME_PF13=0x45,//TCU发送停止充电命令控制器返回超时后，但控制器已经停止充电
	GO_STOP_CHA=0x46,//充电过程中，控制器自行返回待机
};

enum TCU_ERR_CODE
{
	OVTM_DOWN_CHA_PARA =1,//下发充电参数	应答超时
	OVTM_START_CHARGE =2,//充电启动命令应答超时
	OVTM_FINSTART_CHARGE=3,//等待充电启动完成状态超时
	OVTM_STOP_CHARGE=4,//充电停止命令应答超时
	OVTM_FINSTOP_CHARGE=5,//等待充电停止完成状态超时
	OVTM_SETTIME_CHA=6,//	对时操作应答超时
	OVTM_EN_DISEN_SERVER=7,//充电服务启停应答超时
	OVTM_CTRL_LOCK =8,//电子锁控制应答超时
	OVTM_CHANGE_PW =9,//充电功率调节应答超时
	OVTM_CFG_INFO=10,//充电桩配置信	息查询应答超时
	OVTM_AC_YX=11,//交流遥信报文接收超时
	OVTM_DC_YX=11,//直流遥信报文接收超时
	OVTM_AC_YC=12,//交流遥测报文接收超时
	OVTM_DC_YC=12,//直流遥测报文接收超时

};
enum TCU_ORDER
{
	HEART_BEAT_FIRST =0,
	CHECK_VER=1,
	SEND_CHARGE_PARAM=2,
	TCU_SET_TIME=3,
	CONFIG_INFO_QUERY=4,
	TCU_READY=5,
	TCU_CTRL_COMB=6,
	TCU_START_CHARGING=7,
	WAIT_CHARGE=8,//等待充电机动作，收到启动确认开始，收到充电启动完成结束
	WAIT_CHARGEING1=9,//收到pf=11 重复发送pf=12
	WAIT_CHARGEING2=10,//充电进行中,但摇信充电状态仍未0
	WAIT_CHARGEING3=11,//充电进行中
	TCU_STOP_CHARGING=12,
	WAIT_STOP=13,//等待停止完成
	RESEND_STOP=14,//收到pf=13 重复发送pf=14
	TCU_IDEL=0xff,

};

typedef struct
{
	int MX1;	//  负荷控制开关
	int MX2;	// 成功标识
	int MX3;	// 失败原因

	struct
	{
		unsigned char MX4[3];	//充电桩与BMS通信协议版本号
		unsigned char MX5[3];	//BMS与充电桩通信协议版本号
		unsigned char MX6;	//充电桩与 BMS握手结果
		unsigned char MX7;	//电池类型
		unsigned char MX8;	// 最高允许温度
		unsigned short MX9;//BMS 最高允许充电电压
		unsigned short MX10;//单体最高允许充电电压
		unsigned short MX11;//最高允许充电电流
		unsigned short MX12;//整车动力蓄电池额定总电压
		unsigned short MX13;//整车动力蓄电池当前电压
		unsigned short MX14;//整车动力蓄电池额定容量
		unsigned short MX15;//整车动力蓄电池标称能量
		unsigned short MX16;//整车动力蓄电池荷电状态
		unsigned short MX17;//充电机最高输出电压
		unsigned short MX18;//充电机最低输出电压
		unsigned short MX19;//充电机最大输出电流
		unsigned short MX20;//充电机最小输出电流
		unsigned char MX21[17];	// 车辆识别码
	}dc;

}start_mx;
typedef struct
{
	unsigned char MX1;	//   停止原因
	unsigned char MX2;	// 成功标识
	struct
	{

		unsigned char MX3;	// BMS 中止充电原因

		unsigned char MX4[2];	//BMS 充电故障原因

		unsigned char MX5;	//BMS 中止错误原因

		unsigned char MX6;	//中止荷电状态SOC（%）

		short MX7;	//动力蓄电池单体最低电压
		short MX8;	// 动力蓄电池单体最高电压
		unsigned char MX9;//动力蓄电池最低温度
		unsigned char MX10;// 动力蓄电池最高温度
		unsigned short MX11;//接收SPN2560=0x00的充电机辨识报文超时
		unsigned short MX12;//接收SPN2560=0xAA的充电机辨识报文超时
		unsigned short MX13;//接收充电机的时间同步和充电机最大输出能力报文超时
		unsigned short MX14;//接收充电机完成充电准备报文超时
		unsigned short MX15;//接收充电机充电状态报文超时
		unsigned short MX16;//接收充电机中止充电报文超
		unsigned short MX17;//接收充电机充电统计报文超时
		unsigned char MX18[6];// BMS 其他错误
		unsigned short MX19;//接收 BMS 和车辆的辨识报文超时
		unsigned short MX20;//接收电池充电参数报文超时
		unsigned short MX21;	// 接收 BMS 完成充 电准备报文超时
		unsigned short MX22;//接收电池充电总状 态报文超时
		unsigned short MX23;//接收电池充电要求报文超时
		unsigned short MX24;//接收 BMS 中止充电报文超时
		unsigned short MX25;//接收 BMS 充电统计报文超时
		unsigned char MX26[6];	// 充电机其他错误

	}dc;
}end_mx;
#define TCU_CMD_CHARGE_START					0x01   	//	开始充电
#define CTL_CMD_START_RESPONSE					0x02	//	充电响应

#define TCU_CMD_CHARGE_STOP						0x03  	//	停止充电
#define CTL_CMD_STOP_RESPONSE 					0x04

#define TCU_CMD_TIME_SET						0x05  	//	对时
#define CTL_CMD_TIME_SET						0x06

#define TCU_CMD_VERSION_CALIBRATION				0x07	//	版本校验
#define CTL_CMD_VERSION_CONFIRM					0x08

#define TCU_CMD_SEND_CHARGE_PARAM				0x09   	//	充电参数发送
#define CTL_CMD_CHARGE_PARAM_CONFIRM			0x0a	//	

#define TCU_CMD_CHARGE_SERVER_CONTROL			0x0b  	//	改变充电服务状态  tt000000000出现can故障

#define CTL_CMD_CHARGE_SERVER_FEEDBACK			0x0c
#define TCU_CMD_ELE_LOCK_CONTROL				0x0d	//	电子锁
#define CTL_CMD_ELE_LOCK_FEEDBACK				0x0e

#define TCU_CMD_POWER_ADJUST_CONTROL			0x0f 	//	调节功率
#define CTL_CMD_POWER_ADJUST_FEEDBACK			0x10

#define TCU_CMD_CHARGE_CONFIG_INFO_QUERY 		0x60
#define CTL_CMD_CHARGE_CONFIG_INFO_FEEDBACK 	0x61


/* status frame PF */
#define CTL_STATUS_STARTUP_COMPLETE				0x11
#define TCU_STATUS_STARTUP_COMPLETE_RESPONSE	0x12

#define CTL_STATUS_STOP_COMPLETE				0x13
#define TCU_STATUS_STOP_COMPLETE_RESPONSE		0x14

// NW 的这两个指令不再使用
#define CTL2TCU_NW_15              				0x15
#define CTL2TCU_NW_16              				0x16

// CCU 向 TCU 发送状态信息
#define CTL2TCU_XJ_DC_15			0x15	// 直流模块充电状态信息
#define CTL2TCU_XJ_AC_16			0x16	// 直流模块充电状态信息

#define TCU2CTL_NW_19              				0x19

/* data frame PF */
#define CTL_DATA_DC_TELEMETRY					0x20	//	直流桩遥测数据帧返回
#define TCU_DATA_DC_TELEMETRY					0x21	//	直流桩遥测数据帧
#define CTL_DATA_DC_TELESIGNAL_1				0x22	//	直流桩的遥信数据返回
#define CTL_DATA_DC_TELESIGNAL_2				0x23	//	直流桩的遥信数据返回

#define CTL_DATA_AC_TELEMETRY					0x30
#define TCU_DATA_AC_TELEMETRY					0x31
#define CTL_DATA_AC_TELESIGNAL_1				0x32
#define CTL_DATA_AC_TELESIGNAL_2				0x33

/* heart frame PF */
#define TCU_HEART								0x40
#define CHA_HEART								0x41


/* error frame PF */
#define TCU_ERROR_STATUS						0x51
#define CTL_ERROR_STATUS						0x52

/*And Charge Seting 并充设置*/
#define TCU_CMD_AND_CHARGE_SETING 				0x95
#define CTL_CMD_AND_CHARGE_SETING_RESPONSE 		0x96




typedef struct {
	u8 state;//当前状态
	u8 state_ctrl;//当前控制状态
	u8 curpf;
	u16 curpos;//正在执行的pf在表格中的位置
	u16 heart_pos;//心跳pf在表格中的位置
	u16 fk_pos;//负荷控制指令在表格中的位置
	u16 yc_pos;//摇测pf在表格中的位置
	u16 err_pos;//错误帧pf在表格中的位置

    u8 comm_cutoff;
	u16 err_code_all;//
	u8 stop_reason;//本次停止充电原因

    int  ms_heart_recv;//上次收到心跳后到现在的毫秒
    int  ms_heart_send;//上次发送心跳后到现在的毫秒
    int ms_cur_send;//本次状态下发送帧到现在的毫秒
    int ms_cur_recv;//本次状态下等待接收到现在的毫秒
    int ms_yc_send;//摇测最后发送到现在的毫秒
    int ms_yc_recv; //摇测最后接收到现在的毫秒
    int ms_yx_recv;//摇信最后接收到现在的毫秒
    int ms_comm_recv;//收到最后帧到现在的毫秒


    int ms_err_send;//错误帧最后发送到现在的毫秒
    int  ms_rest_err;//剩余错误帧发送时间
    int ms_fk_send;//功率调节帧发送到现在的毫秒
    int ms_fk_recv;//功率调节帧发送后等待时间
    u8 ctrltype;  //0 百分比  1 数值
    int ctrlvalue;//功率控制值
    int ctrtime;//功率控制时间 20200320-ltp新增

} libcan_t;
typedef struct
{
	u8 pf;
    u8 re_pf;//回应pgn
    u8 re_flag;//回应标志 0 不回应 1 编程返回
	u8 priority;//优先级
	int dly;//重发间隔时间
	int over;//超时时间
    char* exp;
} Cha_TcuInstruction;

typedef struct
{
	u8 pf;
	u8 err_code;
    int rest_ms_err;//错误帧剩余时间

} OverTimeErr;

typedef struct
 {
	  long msgtype;
	  char pmsg[sizeof(GW_Can)+4];
}msgtcu;

#define GUN_NUM     8
typedef struct {
	/* 多帧数据相关 */
	unsigned char port;
	unsigned char chaaddr;
	unsigned char frm_gunno;
	unsigned char tcu_gunno;
	unsigned char priPF; //帧格式
	unsigned char frameSumCount; //总帧
	unsigned char frameIndex; //帧索引
	unsigned char lastFrameDataLen; //最后一帧的字节数
	unsigned short dataLen; //有效数据字节数
	unsigned short dataIndex; //有效字节索引
	unsigned char multiFrameData[128]; //有效数据帧缓存
}MultFrame;
struct RecvPara
{
	u8 port;
	u8 addr;
	int qid;

};
struct SendPara
{
	u8 phy_gunno;
	int qid;

};
extern char _tmp_print_str[128];
extern Para_Can * gpcan_para;
extern libcan_t g_can[];
extern SendPara sendpara[];
int handleRecvPort(u8 port,u8 addr,msgtcu* pmsgs);
int AnalyzeData(u8 gunid,u8 pf,u8 lendata,u8* pdata);
void timed2Cha(u8 gunid);
void auto2Cha(u8 gunid);
void initcan(void);
int start_charge(u8 gunid, char ctrlPW) ;
int stop_charge(u8 gunid, char reason) ;
int adjust_pw(u8 gunid);

u8 getChargeState(u8 gunid);
void _addtime_(int interval);
void finStopCharge_f(u8 gunid,u8 reason);
void finStartCharge_f(u8 gunid,u8 reason);
int off_gunLock(u8 gunid,u8 type);

extern BackResult myorder;
#ifdef __cplusplus
}; //end of extern "C" {
#endif
#endif /* TCU_CAN_H_ */
